package com.zero2oneblog.service.impl;

import com.zero2oneblog.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisServiceImpl implements RedisService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void storeValue(String key, String value) { //这里为什么是String
        // 存储值
        stringRedisTemplate.opsForValue().set(key, value);
    }

    @Override
    public String getValue(String key) {
        // 获取值
        return stringRedisTemplate.opsForValue().get(key);
    }

    @Override
    public void updateValue(String key, String newValue) {
        // 更新值
        stringRedisTemplate.opsForValue().set(key, newValue);
    }

    @Override
    public boolean keyExists(String key) {
        // 检查 key 是否存在
//        return stringRedisTemplate.hasKey(key);
        // 检查 key 是否为 null
        if (key == null) {
            // 处理 null key 的情况
            return false;
        }

        // 检查 key 是否存在
        return Boolean.TRUE.equals(stringRedisTemplate.hasKey(key));//'stringRedisTemplate.hasKey(key)' 取消装箱可能产生 'NullPointerException'
    }

    @Override
    public Long incrementAndGetValue(String key) {
        // 将 key 对应的值加一，并返回增加后的值   要考虑多线程争夺的问题  opsForValue().increment 方法，该方法会原子性地将指定 key 的值加一，并返回增加后的值。
        return stringRedisTemplate.opsForValue().increment(key);
    }
}
